import { Builder, Browser, By, Key, until } from "selenium-webdriver";
import delay from "delay";
import fs from "fs";
//构建一个 webdriver 浏览器
let driver = await new Builder().forBrowser(Browser.FIREFOX).build();
(async function start() {
  try {
    // getcooike();
    // return;
    // 打开网站
    await driver.get("https://www.lagou.com");
    console.log("打开网站");
    // 最大化
    await driver.manage().window().maximize();
    // 删除所有cooike
    await driver.manage().deleteAllCookies();
    console.log("删除cooikes完成");
    //读取 cookies
    const cookies = JSON.parse(fs.readFileSync("./cookies.json", "utf-8"));

    // 循环添加cookie
    for (let index = 0; index < cookies.length; index++) {
      // 因为浏览器对于带有SameSite=None的cookie要求必须同时设置Secure属性，以确保安全性
      cookies[index].secure = true;
      await driver.manage().addCookie(cookies[index]);
    }
    console.log("写入cooikes");
    await delay(3000);
    // 重新打开让cooikes 生效
    await driver.get("https://www.lagou.com");
    console.log("刷新页面");
    await delay(5000);
    // 获取输入框搜索前端
    await driver
      .findElement(By.css("#search_input"))
      .sendKeys("前端", Key.RETURN);
    console.log("搜索前端");
    await delay(5000);

    // 获取所有窗口句柄
    const handles = await driver.getAllWindowHandles();

    // 切换到新打开的标签页
    await driver.switchTo().window(handles[1]); // 假设新标签页是第二个句柄
    await delay(5000);
    console.log("切换tab标签栏目");
    await gitCity();
    await getData();
  } catch (e) {
    console.log(e);
  } finally {
    console.log("退出浏览器");
    await driver.quit(); //
  }
})();
let low = 0; // 10K 以下的岗位数量
let mid = 0; // 10K ~ 20K 的岗位数量
let high = 0; // 20K 以上的岗位数量

let currentPage = 1; // 当前第几页
const maxPage = 3; // 最大页数 30 页
const cityArr = ["北京", "上海", "广州", "深圳", "武汉"];
let cityIndex = 0; //城市索引
const results = []; //数据

// 获取数据
async function getData() {
  // 获取所有条目
  console.log(`---正在获取${cityArr[cityIndex]}的第${currentPage}页数据---`);
  await delay(10000);

  // 获取每一页的所有数据
  const items = await driver.findElements(By.css(".item__10RTO"));
  // console.log(items.length);

  // 获取所有的岗位薪资
  const moneys = await Promise.all(
    items.map((item) => item.findElement(By.css(".money__3Lkgq")).getText())
  );
  // console.log(moneys);

  // 进行数量统计
  moneys.forEach((item) => {
    const money = item.split("-")[0].slice(0, -1);
    money < 10 && low++;
    money >= 10 && money < 20 && mid++;
    money >= 20 && high++;
  });
  // console.log(low, mid, high);

  // 获取完当前页的数据了
  if (currentPage < maxPage) {
    // 点击下一页进行页码累加
    await driver
      .findElement(By.css(".lg-pagination-next .lg-pagination-item-link"))
      .click();
    currentPage++;
    await getData();
  } else {
    // 说明已经把当前城市获取完成了
    // 存储结果
    results.push({
      city: cityArr[cityIndex],
      low,
      mid,
      high,
    });
    // 写入到本地
    fs.writeFileSync("./results.json", JSON.stringify(results));
    console.log(cityArr[cityIndex], "数据写入成功");
    console.log(results);
    // 城市索引自增并判断还有没有城市, 没有就直接结束
    // ++i是先进行自增操作，然后再进行运算，换句话说，表达式++i的值是i自增1之后的值
    if (!cityArr[++cityIndex]) {
      console.log("数据拉取完毕");
      return;
    }
    // 让指定的城市被点击
    await gitCity();
    // 重置条件
    currentPage = 1;
    low = mid = high = 0;

    // 继续递归调用
    await getData();
  }
}
// 获取城市
async function gitCity() {
  // 获取所有可以点击的城市
  const cities = await driver.findElements(By.css(".option__2xJt5"));
  // 查找文本内容为北京的 div 让它被点击
  for (let i = 0; i < cities.length; i++) {
    const city = cities[i];
    const text = await city.getText();
    if (text === cityArr[cityIndex]) {
      console.log(text, "要点击的元素");
      await city.click();
      break;
    }
  }
}

//保存cookies
async function getcooike() {
  await driver.get("https://www.lagou.com/wn?");
  // 删除所有cooike
  await driver.manage().deleteAllCookies();
  // 最大化
  await driver.manage().window().maximize();
  await delay(5000);
  // 搜索
  await driver
    .findElement(By.css("#search_input"))
    .sendKeys("前端", Key.RETURN);
  // 延迟10秒 登陆准备cooike
  await delay(20000);
  const cookies = await driver.manage().getCookies();
  console.log(cookies);
  fs.writeFileSync("cookies.json", JSON.stringify(cookies));
}
